package tg.loader.test;


/**
 * 游戏接口
 * @author NKW
 * 实现游戏逻辑，供主模块实例化
 * 
 * 游戏实例是在  上层管理的，创建实例后 如果是实时双工通信的协议：如 webSocket或传统的socket都是，
 * 在传输层需要
 * 通讯有两种：  
 *    1.web被动双工，只能实现被动游戏服务，全部用轮询的方式: 游戏状态切换，开奖，额度变化都用轮询
 *    2.socket实时全双工，游戏被动服务外，还可以主动广播功能：开奖和游戏状态切换可以更及时，额度变化也是可以
 *    
 *    电子游戏几乎不需要广播，但是有可能中累积时需要，这个可能用轮询也没大问题（做跑马灯）
 *    真人游戏，用web做短轮询也可以，用socket可以更实时
 *    对战游戏也是一桌要广播的，一人出的牌后广播通知所有桌上的才可以及时
 *  web实现时无法广播，所以游戏中需要有轮询的服务，都在那里实现，基本服务两种通讯共用，但是web的轮询需要优化成统一一个通知来轮询，所以要再多个轮询的服务，里面
 *  整合所有的变化信息获取
 *  socket可以调用具体的服务，两种需要兼容
 *  socket广播时，最好在路口才真正的广播，如果有路口连接直接发一份给它就好，让它来做广播，如果是直连的当然要做好 依游戏桌来分组管理，按桌来直接广播，路口的广播也包含在里面
 *  路口在得到广播通知时（路口也得做好游戏桌分组管理），给指定桌广播，或全体广播，是有可能全体广播的
 *  socket模块得写好，同时得写好路口模块，这样布署就方便，而且提升效率，路口和主服务器之间用连接池，提升效率
 *  可以用zbus中间件来和web做通讯
 *  
 *  报表生成在数据库了，所以是公用的了
 *  下注一笔可以做在数据库，用来公用的
 *  多笔做在内存，就好
 *  
 *  游戏内部只需要做好：
 *     游戏流程
 *        真人需要人工推动流程切换
 *     下注处理
 *     信息查询：游戏状态查询 ，注单查询，赔率变化查询，操盘变化查询，场次结算信息查询（不要要各个主动通知，只要有下注来查询就好,主动通知的最主要及时就好）
 *           该通知的也要可查询 ，兼容轮询的
 *     变化通知：游戏状态切换通知，开奖变化通知  （结算不用在后台做，只要前端显示就好，如果是前端有下注再查询一下本场结算信息）
 *          结算后主动通知结算完成（也算通知你去主动刷新余额和中奖信息），客户端可以在本地算出输赢，也可以主动去后服务后台取回新余额和中奖额，多请求一次没什么
 *     
 *  用户游戏设定
 *     所有都用相对值来存，然后数据库用一个字段json串存就好，真实多少字段，由不同的游戏自己实现，都在内存处理
 *     这样的好处是更新不会级联，只更新自己，量也少，灵活，在内存实际用多个字段来表达
 *     可以做成公用模块，每个游戏引用就好
 *     最小值（下级比我大），最大值（下级要比我小），布尔值（所有级一个为假都为假，所有级全真才为真） ，  还有一种无级联关系：任意值（吃货量设定就是本级对自己的设定）
 */
public interface IGameApp {
	/**
	 * 启动游戏
	 */
	public void start();
	/**
	 * 游戏暂停
	 * 暂停下注，暂停加载新期，当前期不关闭，可以随时恢复的
	 */
	public void pause();
	/**
	 * 游戏继续
	 * 如果是多期，当前时间点加载期数
	 */
	public void goOn();
	/**
	 * 停止游戏
	 * 如果是多期的就停止加载期数就好，当前期关闭
	 */
	public void stop();
	/**
	 * 绑定具体的哪一桌（把桌的记录传进去，要做好公用包里定义桌）
	 * 到时桌信息需要传入
	 * 真人对战的【斗地主】类的游戏，他们的桌是期数，是局，就是【期数】，不是这里说的桌
	 * 这里的桌是游戏服务的意思，斗地主是在一个游戏服务里有100桌这样，看服务器能力来配置
	 * 
	 * 游戏定义中如果有入口参数的定义，放在桌子记录下的参数字段 
	 * 游戏参数信息（定义游戏时就有定义游戏参数，绑定到桌时，会把参数值放到桌子字段 里，这里传给它）：
	 *    比如百家乐，倒计时多少秒：30秒或40秒
	 *    比如扑克牌有没有含两张鬼等
	 *    或其他游戏的游戏层的参数
	 */
	public void bindTable();
	/**
	 * 添加广播监听
	 * 如果此游戏需要广播，直接通知监听器，需要广播就好，初始化后会把监听器扔进来
	 * 有广播需要都调用监听器发送广播，socket的可以马上收到
	 * 如果是web的只能集成到轮询方法里面
	 * 上级监听到本游戏需要广播时，把它的广播消息推给本游戏的所有在线用户（上级需要管理本游戏用户队列）
	 *   上级需要知道用户在当前在哪个游戏，或者在大厅页面， 或者同时多个游戏都可以，只要在游戏界面就登记在那个游戏，关闭游戏界面就注销
	 *   
	 */
	public void addBroadCastListener();
	/**
	 * 处理游戏请求服务，所有的被动服务都在这里，具体的游戏自己去解析处理
	 * @param request
	 * @return
	 * 这里的请求格式有可能是Json，也有可能是二进制
	 */
	public Response handleRequest(Request request);
}
